﻿using log4net;
using PcaCore.DAL;
using PcaSocios.BOL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PcaSocios.DAL
{
    public class dCliente
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dCliente));

        #region public

        public static long Insert(oCliente myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_socios.fn_add_cliente(varchar,--empresa_id $1
                //             varchar,--oficina_id $2
                //             integer,--tipo_cliente_id $3
                //             bigint,--sesion_id $4
                //             varchar,--tipo_documento_identidad_id $5
                //             varchar,--numero_documento_identidad $6
                //             varchar,--nombre $7
                //             varchar,--pais_id $8
                //             varchar,--direccion $9
                //             varchar --email $10
                //             )RETURNS bigint
                object id = Core.ExecuteScalar("pca_socios.fn_add_cliente",
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.empresa_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.oficina_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, myClass.tipo_cliente_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.sesion_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.tipo_documento_identidad_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.numero_documento_identidad),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.nombre),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.pais_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.direccion),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.email));

                return Convert.ToInt64(id);
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Update(oCliente myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_socios.fn_update_cliente(varchar,--empresa_id $1
                //            bigint,--cliente_id $2
                //            integer,--tipo_cliente_id $3
                //            bigint,--sesion_id $4
                //            varchar,--tipo_documento_identidad_id $5
                //            varchar,--numero_documento_identidad $6
                //            varchar,--nombre $7
                //            varchar,--pais_id $8
                //            varchar,--direccion $9
                //            varchar --email $10
                //            )RETURNS void
                Core.ExecuteNonQuery("pca_socios.fn_update_cliente",
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.empresa_id),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.cliente_id),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, myClass.tipo_cliente_id),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.sesion_id),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.tipo_documento_identidad_id),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.numero_documento_identidad),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.nombre),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.pais_id),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.direccion),
                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.email));

            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Delete(string empresaId,
                                  long clienteId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_socios.fn_del_cliente(varchar,--empresa_id $1
                //             bigint --cliente_id $2
                //             )RETURNS void
                Core.ExecuteNonQuery("pca_socios.fn_del_cliente",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, clienteId)); 
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static List<oVwCliente> GetList(int start,
                                              int limit,
                                              out int totalRecords,
                                              string empresaId,
                                              string filtro)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_socios.fn_get_list_cliente(integer,--start $1
                //              integer,--limit $2
                //              varchar,--empresa_id $3
                //              varchar --filtro(nombre-direccion-documento de identidad) $4
                //              )RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oVwCliente>("pca_socios.fn_get_list_cliente",
                                                         out totalRecords,
                                                         new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                         new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                         new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                         new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, filtro));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oVwCliente Get(string empresaId,
                                     long clienteId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_socios.fn_get_cliente(varchar,--empresa_id $1
                //             bigint --cliente_id $2
                //             )RETURNS SETOF pca_socios.vw_clientes
                return Core.GetObjectDb<oVwCliente>("pca_socios.fn_get_cliente",
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, clienteId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name); 
            }
        }

        #endregion
    }
}
